uniform float iTime;
uniform vec4 iMouse;
uniform vec3 iResolution;
uniform float iPercentX;
uniform float iPercentY;
uniform float uAmplitude;


varying vec2 vUv;
varying vec4 vWorldPosition;


#define FIXED_PART_PERCENT 0.0

#define MATH_E              2.71828
#define MATTH_PI            3.14159

#define SPREAD_START_POINT 0.4  // 开始扩散的位置
#define SPREAD_END_POINT   0.95 // 完全扩散的位置

// 二次贝塞尔曲线插值
vec3 quadraticBezier(vec3 p0, vec3 p1, vec3 p2, float t) {
    float oneMinusT = 1.0 - t;
    return oneMinusT * oneMinusT * p0 + 2.0 * oneMinusT * t * p1 + t * t * p2;
}

void main() {
    // uBoundsMax
    /*
        传入的是局部坐标, 这个模型范围也是局部坐标系的范围
        qml: Maximum:  0.664758026599884 0 1
        qml: Minimum:  QVector3D(-0.637179, 0, -5.08459)
    */
    vec3 originalPos = position;
    vec3 uBoundsMax = vec3( 0.664758026599884, 0, 1 );
    vec3 uBoundsMin = vec3( -0.637179, 0, -5.08459 );

    float uPercentX = iPercentX / iResolution.x;
    float uPercentY = iPercentY / iResolution.y;

    // 固定部分的范围 不进行贝塞尔曲线弯曲 x 错误的写法 丢弃
    float zRange = uBoundsMax.z - uBoundsMin.z;
    float normalizedZ = ( originalPos.z - uBoundsMin.z ) / zRange;
    // if ( normalizedZ < FIXED_PART_PERCENT ) return;

    // 弯曲强度
    float bendStrengthX = uPercentX * 0.02;
    float bendStrengthY = uPercentY * 0.02;

    // X方向弯曲 左右弯曲
    if (abs(bendStrengthX) > 0.01 || abs(bendStrengthY) > 0.01) {
        float t = normalizedZ;  // 贝塞尔曲线参数
        // 修改p0作为控制点，而不是p1
        // p0是底部控制点（根据输入值改变方向）
        vec3 p2 = vec3(
            // 使底部朝向与输入值成反比（向左倾斜时底部向右移）
            originalPos.x + bendStrengthX * 2.0,  
            originalPos.y + bendStrengthY * 2.0,
            uBoundsMin.z
        );
        // p1是中间固定点（不变）
        vec3 p1 = vec3(
            originalPos.x, 
            originalPos.y, 
            (uBoundsMin.z + uBoundsMax.z) * 0.5
        );
        // p2是顶部点（固定原始位置）
        vec3 p0 = vec3(originalPos.x, originalPos.y, uBoundsMax.z);
        // 应用贝塞尔变形
        vec3 bezierPos = quadraticBezier(p0, p1, p2, t);
        // 更新顶点位置，保留Z坐标
        originalPos.x = bezierPos.x;
        originalPos.y = bezierPos.y;
    }

    // 添加上下摆动的波浪效果
    originalPos.y += sin(sin( iTime*5.0 + position.z )) * uAmplitude;
    // originalPos.y += sin(sin( iTime*5.0 + position.z ));
    // vWorldPosition = modelMatrix * vec4( position, 1 );
    gl_Position = projectionMatrix * modelMatrix * vec4( position*iTime, 1.0 );
    csm_Position = originalPos;
    vUv = uv;
}